﻿////轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果
//
//#include <opencv2/opencv.hpp>
//#include <iostream>
//#include <math.h>
//
//
//using namespace std;
//using namespace cv;
//
//Mat src, dst;
//const char* output_win = "findcontours-demo";
//int threshold_value = 100;
//int threshold_max = 255;
//RNG rng;
//void Demo_Contours(int, void*);
//int main(int argc, char** argv) {
//	// 待检测图像
//	src = imread("D:\\Pic\\lq.bmp");
//	if (src.empty()) {
//		printf("could not load image...\n");
//		return -1;
//	}
//	namedWindow("input-image", CV_WINDOW_AUTOSIZE);
//	namedWindow(output_win, CV_WINDOW_AUTOSIZE);
//	imshow("input-image", src);
//	cvtColor(src, src, CV_BGR2GRAY);
//
//	const char* trackbar_title = "Threshold Value:";
//	createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours);
//	Demo_Contours(0, 0);
//
//	waitKey(0);
//	return 0;
//}
//
//void Demo_Contours(int, void*) {
//	Mat canny_output;
//	vector<vector<Point>> contours;
//	vector<Vec4i> hierachy;
//	Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);
//	findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
//
//	dst = Mat::zeros(src.size(), CV_8UC3);
//	RNG rng(12345);
//	for (size_t i = 0; i < contours.size(); i++) {
//		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
//		drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
//	}
//	imshow(output_win, dst);
//}
//
////以上代码中主要的几个知识点解释下：
////
////1.findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
////
////发现轮廓
////
////findContours(
////
////	InputOutputArray  binImg, // 输入图像，非0的像素被看成1,0的像素值保持不变，8-bit
////
////	OutputArrayOfArrays  contours,//  全部发现的轮廓对象
////
////	OutputArray, hierachy// 图该的拓扑结构，可选，该轮廓发现算法正是基于图像拓扑结构实现。
////
////	int mode, //  轮廓返回的模式
////
////	int method,// 发现方法
////
////	Point offset = Point()//  轮廓像素的位移，默认（0, 0）没有位移
////
////)
////
////2.drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
////
////绘制轮廓
////
////drawContours(
////
////	InputOutputArray  binImg, // 输出图像
////
////	OutputArrayOfArrays  contours,//  全部发现的轮廓对象
////
////	Int contourIdx// 轮廓索引号
////
////	const Scalar & color,// 绘制时候颜色
////
////	int  thickness,// 绘制线宽
////
////	int  lineType,// 线的类型LINE_8
////
////	InputArray hierarchy,// 拓扑结构图
////
////	int maxlevel,// 最大层数， 0只绘制当前的，1表示绘制绘制当前及其内嵌的轮廓
////
////	Point offset = Point()// 轮廓位移，可选
////
////	）
